package com.lost.octopus.es.helper.service;

import com.lost.octopus.es.helper.constant.IndexSettingEnum;
import com.lost.octopus.es.helper.entity.model.QueryBuilder;
import com.lost.octopus.es.helper.entity.query.QueryResult;

import org.elasticsearch.action.search.SearchResponse;
import org.springframework.data.elasticsearch.annotations.Document;

import java.io.IOException;
import java.util.Map;

import lombok.NonNull;

/**
 * es服务接口，支持单index和多index操作
 * @author zhangbh
 **/
public interface EsService {


    /**
     * 删除索引，比清空效率高
     * @param index 索引名称，可以是别名
     * @return 真实名称
     */
    boolean deleteIndex(String index);

    /**
     * 重置索引，比清空效率高
     * @param index 索引名称，可以是别名
     * @param clazz 注解了Document的对象 {@link Document}，如果为空不创建Mapping
     * @return 真实名称
     */
    boolean reCreateIndex(String index, Class<?> clazz);

    /**
     * 查询，可以使用 getBoolQueryBuilder + getSort自定义查询
     * 场景，当注解功能无法实现时使用
     * @param search 查询对象
     * @param clazz 转换类型
     * @param indices 索引
     * @return 查询结果
     * @throws IOException 异常信息
     */
    <T> QueryResult<T> boolSearch(QueryBuilder search, Class<T> clazz, String... indices) throws IOException;

    /**
     * 查询，可以使用 getBoolQueryBuilder + getSort自定义查询
     * 场景，当注解功能无法实现时使用
     * @param search 查询对象
     * @param indices 索引
     * @return 查询结果
     * @throws IOException 异常信息
     */
    QueryResult<Map<String, Object>> boolSearch(QueryBuilder search, String... indices) throws IOException;

    /**
     * 获取原始的es返回对象 {@link SearchResponse}
     * @param search 查询构建对象
     * @param indices 索引
     * @return es返回对象
     * @throws IOException 异常
     */
    SearchResponse boolSearchGetResponse(QueryBuilder search, String... indices) throws IOException;

    /**
     * 设置最大请求数，默认数据到1万就结束了
     * @param index 索引
     * @param maxResult 最大返回个数
     * @return 操作是否成功
     */
    boolean setMaxResultWindow(@NonNull String index, Integer maxResult);

    /**
     * 动态配置index设置
     * @param index 索引
     * @param settings 配置值 {@link IndexSettingEnum} 常见key
     * @return 操作是否成功
     */
    boolean indexSetting(@NonNull String index, @NonNull Map<String, Object> settings);

    /**
     * 检查是否存在
     * @param index 索引id
     * @return 是否存在
     */
    boolean indexExist(@NonNull String index);

    /**
     * 获取真实索引名称，可在删除使用
     * {@link #deleteIndex(String)} 删除索引需要指定真实index
     * @param aliasName 别名或者索引id
     * @return 真实索引id
     */
    String getRealIndexName(@NonNull String aliasName);
}
